#!/bin/bash
# mysql_backup.sh: 备份 MySQL 数据库并保留最近 5 天的备份。
# 
# ${db_user} 是 MySQL 用户名
# ${db_password} 是 MySQL 密码
# ${db_host} 是 MySQL 主机
# 
# /root/mysql_backup.sh
# 每天 3:00 AM 执行数据库备份
# 0 3 * * * /root/mysql_backup.sh
# /etc/cron.daily

# 定义 MySQL 用户名
db_user="root"
# 定义 MySQL 密码
db_password="mysql"
# 定义 MySQL 主机地址
db_host="localhost"

# 定义备份文件存储目录
backup_dir="/var/lib/backup/"

# 要备份的数据库名称
# 这里是直接指定了一个数据库名称，也可以通过查询所有数据库名称来备份所有数据库
# all_db="$(${mysql} -u ${db_user} -h ${db_host} -p${db_password} -Bse 'show databases')" 
all_db="dasdasd"

# 要保留的备份天数
backup_day=10

# 数据库备份日志文件存储路径
logfile="/var/lib/backup/mysql_backup.log"

# SSH 端口号
ssh_port=3306
# 定义 SSH 自动登录的密钥文件路径
id_rsa=/root/auth_key/id_rsa_153.141.rsa
# 定义 SSH 自动登录的用户名
id_rsa_user=rsync
# 定义要同步的远程服务器目录路径（必须是绝对路径）
clientPath="/home/backup/mysql"
# 定义要镜像的本地文件目录路径（必须是绝对路径）
serverPath=${backup_dir}
# 生产环境的 IP 地址
web_ip="192.168.0.2"

# 定义备份文件的日期格式 (yyyy-mm-dd)
time="$(date +"%Y-%m-%d")"

# MySQL 和 mysqldump 二进制文件的路径
mysql="/usr/bin/mysql"
mysqldump="/usr/bin/mysqldump"

# 确保备份目录存在，不存在则创建
test ! -d ${backup_dir} && mkdir -p ${backup_dir}

# 备份数据库的函数
mysql_backup()
{
    # 遍历所有指定的数据库
    for db in ${all_db}
    do
        # 定义备份文件名
        backname=${db}.${time}
        dumpfile=${backup_dir}${backname}
        
        # 将备份开始时间和数据库名写入日志
        echo "------"$(date +'%Y-%m-%d %T')" Beginning database "${db}" backup--------" >>${logfile}
        
        # 使用 mysqldump 备份数据库，并将输出重定向到 SQL 文件
        # ${mysqldump} -F -u${db_user} -h${db_host} -p${db_password} ${db} > ${dumpfile}.sql 2>>${logfile} 2>&1

        ${mysqldump} -u${db_user} -h${db_host} -p${db_password} ${db} > ${dumpfile}.sql 2>>${logfile} 2>&1

        # 记录开始压缩 SQL 文件的时间
        echo $(date +'%Y-%m-%d %T')" Beginning zip ${dumpfile}.sql" >>${logfile}
        
        # 将 SQL 文件压缩成 tar.gz 文件，并删除原 SQL 文件
        tar -czvf ${backname}.tar.gz ${dumpfile}.sql 2>&1 && rm ${dumpfile}.sql 2>>${logfile} 2>&1
        
        # 记录压缩后的文件名
        echo "backup file name:"${dumpfile}".tar.gz" >>${logfile}
        echo -e "-------"$(date +'%Y-%m-%d %T')" Ending database "${db}" backup-------\n" >>${logfile}
    done
}

# 删除旧备份的函数
delete_old_backup()
{    
    echo "delete backup file:" >>${logfile}
    
    # 查找并删除当前目录下超过指定天数的备份文件
    find ${backup_dir} -type f -mtime +${backup_day} | tee delete_list.log | xargs rm -rf
    cat delete_list.log >>${logfile}
}

# 同步备份到远程服务器的函数
rsync_mysql_backup()
{
    # 遍历指定的远程服务器 IP 地址
    for j in ${web_ip}
    do                
        echo "mysql_backup_rsync to ${j} begin at "$(date +'%Y-%m-%d %T') >>${logfile}
        
        # 使用 rsync 同步备份文件到远程服务器
        rsync -avz --progress --delete $serverPath -e "ssh -p ${ssh_port} -i ${id_rsa} ${id_rsa_user}@${j}:${clientPath}" >>${logfile} 2>&1 
        
        echo "mysql_backup_rsync to ${j} done at "$(date +'%Y-%m-%d %T') >>${logfile}
    done
}

# 进入备份目录
cd ${backup_dir}

# 执行数据库备份
mysql_backup
# 删除旧备份
delete_old_backup
# 同步备份到远程服务器（此处已被注释掉，如需要可取消注释）
# rsync_mysql_backup

# 记录备份完成的时间
echo -e "========================mysql backup && rsync done at "$(date +'%Y-%m-%d %T')"============================\n\n" >>${logfile}
cat ${logfile}
